package com.tjetc;


import java.util.Scanner;

/*
    命名：
        页面层/业务层：
        增删改查
            查：find，search，get ...getGoodsById
            删：remove
            增：add save
            改：update


        数据层：
            查：select
            删：delete
            增：insert
            改：update


        分层：
            1.实体类：entity domain
            2.业务类：service
            3.页面类：view
            4.工具类：util

          在工作中拿到一个工具类：
          1.看类注释 了解这个类的作用
          2.看方法的使用
                看四要素 最不重要的就是方法体
          3.写main方法进行测试


        1.学会使用面向对象的思想解决
        2.学会代码的分层结构
        3.学会如何自己分析工具类的使用
        4.复习之前学习过的代码逻辑



 */





// 由于我们现在还没有讲解代码的分层 目前我们会将所有的业务代码全部放在实体类中
class Account {

    // 账户余额
    private double balance;
    // 记录 思考：记录数如果满了怎么办？扩容
    private String[] records;

    // 记录数
    private int recordCount;

    // 总记录数
    private int totalRecordCount = 100;

    public Account() {
        // Java规范，代码中不允许出现死值 （会出现很难维护的情况）
        records = new String[totalRecordCount];
        // 测试数据
//        recordCount = 1;
//        records[0] = "出账\t" + 100 + "\t" + 1000;
    }

    // 业务代码
    public void getBalance() {
        System.out.println("当前的余额是：" + balance);
    }

    public boolean checkMoney(double money) {
        if (money <= 0) {
            System.out.println("输入的金额必须大于0");
            return false;
        }
        return true;
    }


    // 入账 一切参数不可信
    public void entry(double money) {
        if (!checkMoney(money)) {
            return;
        }

        balance += money;
        // 入账记录
        addRecord("入账", money);
        // 显示明细
        getBalance();
    }

    public void disbursement(double money) {
        if (!checkMoney(money)) {
            return;
        }

        // 判断出账金额不能大于你的余额
        if (money > balance) {
            System.out.println("金额不足");
            return;
        }
        balance -= money;
        // 添加记录
        addRecord("出账", money);

        // 显示当前余额
        getBalance();
    }

    // 账户自己玩的 ，不需要交互 所以private
    private void addRecord(String type, double money) {
        // 往数组中添加元素 可以拓展 日期 money什么时候为+ 什么时候显示-
        records[recordCount] = type + "\t" + money + "\t" + balance;
        recordCount++;
    }

    // 显示记录
    public void showRecords() {
        // 拓展：使用记录数 如果记录数为0 压根就不显示
        System.out.println("类型\t 金额\t 余额");
        System.out.println("-------------------");
        for (int i = 0; i < recordCount; i++) {
            System.out.println(records[i]);
        }

    }
}

class JavaSystem {
    private Account account;
    private Scanner scanner;

    public JavaSystem() {
//        account = new Account();
        scanner = new Scanner(System.in);
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }


    // 业务代码

    // 显示菜单
    public void showMenu() {
        // 第一次进入菜单
        System.out.println("欢迎进入到零钱通：");
        System.out.println("1.查看余额：");
        System.out.println("2.入账：");
        System.out.println("3.出账：");
        System.out.println("4.查看明细：");
        System.out.println("5.退出：");
        System.out.println("请选择：1-5");
    }

    // 系统运行 一个方法最好只做一件事
    public void run() {
        double money = 0;
        do {
            showMenu();
            int key = scanner.nextInt();
            switch (key) {
                case 1:
                    // 查看余额
                    account.getBalance();
                    break;
                case 2:
                    // 入账
                    System.out.println("请输入入账金额：");
                    money = scanner.nextDouble();
                    account.entry(money);
                    break;
                case 3:
                    // 出账
                    System.out.println("请输入出账金额：");
                    money = scanner.nextDouble();
                    account.disbursement(money);
                    break;
                case 4:
                    // 输出记录 拓展：根据类型来输出
                    account.showRecords();
                    break;
                case 5:
                    System.out.println("再见");
                    return;
                default:

            }
        } while (true);
    }

}


public class _27JavaSmallProjectOOP {
    public static void main(String[] args) {
        /*
            思路分析：
            使用面向对象 ------》 找什么人干什么事！！！！
            1.从需求中分析出类 怎么封装类 ？
                零钱通（ATM） 账户（Account） 系统（JavaSystem）
            2. 这些类中的属性和方法？ 可以从行为（对象之间的交互）入手 知道了要干什么，在干的过程中，你就知道需要什么数据（属性）
                Account
                    入账 出账 查看明细 查看记录 退出系统
                    double balance  余额
                    String[] records 记录
                JavaSystem
                    Account
                    Scanner

            3. 类与类之间的关系？（对象与对象如何进行交互）
                组合关系
            4.思考具体的行为逻辑了

         */
        // 相当于创建一个ATM
        JavaSystem system = new JavaSystem();
        // 相当于有一个账户银行卡
        Account account = new Account();
        // 把银行卡 插入 ATM的过程
        system.setAccount(account);
        // 账户和ATM 开始交互
        system.run();
    }
}
